/**
 * 一个form窗口的基类，新增、显示、修改、审核、审批等功能继承了这个窗口
 * 这个类的处理很复杂，要处理正常的fieldSet,还要处理tab ,accordion,以及是否是子模块的Grid的判断
 * 
 * form里面的主要层次结构如下： form -- fieldSet -- fieldcontainer -- field
 */
Ext.define('app.view.module.form.BaseForm', {
	
	extend: 'Ext.form.Panel',
	
	alias: 'widget.baseform',
	
	requires: [
		'app.view.module.form.FieldSet'
	],
	
	autoScroll: true,
	buttonAlign: 'center',
	
	initComponent: function() {
		var me = this;
		me.buttons = [];
		me.buttons.push({  
            text : '保存',  
            itemId : 'save',  
            glyph : 0xf0c7,
            handler: function(button) {
            	/**
            	 * 一个Form在用loadRecord(model)函数从model中调用数据后，可以用getRecord()来返回model，
            	 * 在数据修改了以后可以直接用updateRecord()来用form中的值更新到model中。
            	 * 
            	 * button.up('form')，就是从这个button的第一个父容器开始一直往上递归，直到找到form为止，
            	 * 这是一个非常好的根据控件找到另一个控件的办法，建立大家都用这种方法来查找控件，不要用getCmp(id) 的这种直接查找的方式。
            	 * 与up对应的还有一个down方法，是查找本控件的子控件的函数。
            	 */
            	button.up('form').getForm().udpateRecord();
            }
        }, {
			text: '关闭',
			itemId: 'close',
			glyph : 0xf148,
			handler: function(button) {
				button.up('window').hide();
			}
		});
		me.items = [];
		
		//this.formScheme是从BaseWindow中传过来的
		var groups = this.formScheme.tf_schemeGroups,
			hasTab = false,
			hasInTabPanel = false,
			inTabPanel;
		
		Ext.Array.each(groups, function(group) {
			group.tf_numCols = group.tf_numCols || me.formScheme.tf_numCols;  
            hasTab = hasTab || (group.tf_displayMode == 'tab');  
            hasInTabPanel = hasInTabPanel || (group.tf_displayMode == 'intabpanel'); 
		});	
		
		if (hasTab) {
			var tabpanel = {
				xtype: 'tabpanel',
				frame: false,
				border: false,
				bodyPadding: '5 5 5 5',
				items: []
			};
			
			groups[0].tf_displayMode = 'tab'; // 如果第一个tab忘了设置  
			var nowtab;
			
			Ext.Array.each(groups, function(group) {
				if (group.tf_displayMode == 'tab') {  
                    if (nowtab)  
                        tabpanel.items.push(nowtab);  
                    nowtab = {  
                        xtype : 'panel',  
                        title : group.tf_formGroupName,  
                        items : []  
                    };  
                }  
                nowtab.items.push(me.createFieldSetOrSubModule(group));
			});
			
			tabpanel.items.push(nowtab);  
            me.items = tabpanel;  
		} else {
			me.bodyStyle = 'padding : 5px 5px 0'; 
			Ext.Array.each(groups, function(group) {
				if (group.tf_displayMode == 'intabpanel') {  
                    inTabPanel = {  
                        xtype : 'tabpanel',  
                        frame : false,  
                        border : false,  
                        height : 400,  
                        items : []  
                    };  
                    Ext.apply(inTabPanel, me.getOtherSetting(group.tf_otherSetting))  
                    me.items.push(inTabPanel);  
                } else if (group.tf_displayMode == 'intab') {  
                    var t = me.createFieldSetOrSubModule(group);  
                    t.title = group.tf_formGroupName;  
                    inTabPanel.items.push(t)  
                } else  
                    me.items.push(me.createFieldSetOrSubModule(group)) 
			});
		}
		this.callParent(arguments);
	},
	
	getOtherSetting : function(str) {  
        if (!str)  
            return {}  
        else  
            return Ext.decode('{' + str + '}', true)  
    },
    
    createFieldSetOrSubModule : function(group) {  
        var me = this;  
        return Ext.create('app.view.module.form.FieldSet', {  
            autoScroll : true,  
            viewModel : this.getViewModel(),  
            schemeGroup : group,  
            numCols : group.tf_numCols  
        });  
    },
    
    initForm : function() {  
  
    },  
  
    // 不是grid中调用的显示某条记录的信息，可能是其他模块点击namefields来调用的  
    setRecordId : function(id) {  
        var me = this;  
        this.module.model.load(id, {  
            success : function(record, operation, success) {  
                // success中的record中返回的raw 数据，是字符串，没有经过decode,要自己转成对象  
                me.setData(Ext.create(me.module.model, Ext.decode(record.raw)));  
            }  
        });  
    },  
  
    setData : function(model) {  
        this.data = model;  
        // this.getForm().reset();  
        if (this.data) {  
            // Ext.suspendLayouts();  
            this.getForm().loadRecord(this.data);  
            // Ext.resumeLayouts(true);  
        } else  
            this.getForm().reset(); // 检查form中是否有子模块，如果有则刷新  
    }
}); 